home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / util / misc / setpri17.lha / SetPri.c < prev    next >
C/C++ Source or Header  |  1994-07-09  |  3KB  |  138 lines

  1. #define __USE_SYSBASE   1
  2.  
  3. #include <exec/types.h>
  4. #include <exec/nodes.h>
  5. #include <exec/tasks.h>
  6. #include <exec/execbase.h>
  7. #include <proto/exec.h>
  8. #include <dos/dosextens.h>
  9. #include <dos.h>
  10. #include <proto/dos.h>
  11. #include <string.h>
  12.  
  13. struct Process *FindProc(char *name);
  14.  
  15.  
  16. #define FORLIST(list,p) for ((p) = (void *)(list)->lh_Head;   \
  17.                              ((struct Node *)(p))->ln_Succ;   \
  18.                              (p) = (void *)((struct Node *)(p))->ln_Succ)
  19.  
  20. const char * VERSTAG = "$VER: SetPri 1.7 (9.7.94) © Richard Waspe 1994 ";
  21.  
  22.  
  23. BOOL IsATask;
  24. BYTE orgpri;
  25.  
  26. int main (void)
  27. {
  28.     LONG pri=0, oldpri=0;
  29.     struct Task *TaskPtr = NULL;
  30.    LONG Quiet = 0;
  31.    struct RDArgs *rda;
  32.    LONG vec[3];
  33.    char * TaskName = NULL;
  34.     vec[0] = 0;
  35.     vec[1] = 0;
  36.     vec[2] = 0;
  37.  
  38.     if (rda = ReadArgs("NAME/A,PRIORITY/A/N,Q=QUIET/S", vec, NULL) )
  39.     {
  40.        TaskName = (char *)(vec[0]);
  41.        pri = *(LONG *)(vec[1]);
  42.        Quiet = vec[2];
  43.  
  44.        if (pri <-50 || pri >19)
  45.        {
  46.            if (!Quiet)
  47.                PutStr("Requested priority out of range\n");
  48.            FreeArgs(rda);
  49.            return 10;
  50.        }
  51.  
  52.       Forbid();
  53.         TaskPtr = (struct Task *)(FindProc(TaskName));
  54.  
  55.         if (TaskPtr == NULL)
  56.         {
  57.             Permit();
  58.             if (!Quiet)
  59.                 Printf("%s not found\n", TaskName);
  60.             FreeArgs(rda);
  61.             return 20;
  62.         }
  63.         else
  64.         {
  65.            if (orgpri != pri)
  66.                oldpri = SetTaskPri(TaskPtr, pri);
  67.            Permit();
  68.            if (!Quiet)
  69.            {
  70.                if (IsATask)
  71.                    Printf("Task ");
  72.                else
  73.                    Printf("Process ");
  74.                if (orgpri == pri)
  75.                    Printf("%s was already at requested priority\n", TaskName);
  76.                else
  77.                    Printf("%s priority changed from %ld to %ld\n", TaskName, oldpri, pri);
  78.            }
  79.            FreeArgs(rda);
  80.            return 0;
  81.        }
  82.    }
  83.    else
  84.        PrintFault(IoErr(), "ReadArgs() error");
  85.  
  86.    return 5;
  87. }
  88.  
  89. struct Process *FindProc(char *name)
  90. {
  91.    struct Process *proc;
  92.    struct List *tasklist[3];
  93.    struct List **plist;
  94.    int len = strlen(name);
  95.  
  96.    tasklist[0] = &SysBase->TaskWait;
  97.    tasklist[1] = &SysBase->TaskReady;
  98.    tasklist[2] = NULL;
  99.  
  100.    Disable();
  101.    for (plist = tasklist; *plist != NULL; plist++)
  102.    {
  103.       FORLIST(*plist, proc)
  104.       {
  105.          if (proc->pr_Task.tc_Node.ln_Type != NT_PROCESS || proc->pr_CLI == 0)
  106.          {
  107.             if (stricmp(proc->pr_Task.tc_Node.ln_Name, name) == 0)
  108.             {
  109.                Enable();
  110.                IsATask = (proc->pr_Task.tc_Node.ln_Type != NT_PROCESS);
  111.                orgpri = proc->pr_Task.tc_Node.ln_Pri;
  112.                return (proc);
  113.             }
  114.          }
  115.          else
  116.          {
  117.             struct CommandLineInterface *cli = (void *)BADDR(proc->pr_CLI);
  118.             unsigned char *cmdname = (void *)BADDR(cli->cli_CommandName);
  119.  
  120.             if (cmdname)
  121.             {
  122.                if (len <= *cmdname && strnicmp(cmdname + *cmdname + 1 - len,
  123.                                               name, len) == 0)
  124.                     {
  125.                   Enable();
  126.                   orgpri = proc->pr_Task.tc_Node.ln_Pri;
  127.                   IsATask = FALSE;
  128.                   return (proc);
  129.                }
  130.             }
  131.          }
  132.       }
  133.    }
  134.    Enable();
  135.    return (NULL);
  136. }
  137.  
  138.